package listNodePractice;



//　todo:关键就是注意size index的边界条件　　
// 含有虚拟头结点的情况下　index与实际元素下标之间的关系
public class MyLinkedList {
    int size;

    //虚拟头结点
    ListNode head;
    public  MyLinkedList(){
        size=0;
        head=new ListNode(0);
    }
    //查看元素
    public  int get(int index){

        if (index<0||index>=size){
            return -1;
        }
        ListNode  getListNode=head;
        //此处含有等号因为含有虚拟头结点　　index 的位置即为要删除元素的节点
        for (int i = 0; i <=index; i++) {
            getListNode=getListNode.next;
        }
        return getListNode.val;
    }


//    增加元素
    public  void  addAtHead(int val){
        addAtIndex(0,val);

    }

    public  void  addAtTail(int val){
        addAtIndex(size,val);

    }

    public  void addAtIndex(int index,int val){
        if (index>size){
            return;
        }
        //todo:这样写有一定的包容性　
        // 只要给出小于０的索引位置　
        // 　　都默认是在链表头部加入节点
        if (index<0){
            index=0;
        }
        size++;
        //pre为要加入节点元素的前驱节点

        ListNode pre=head;
        for (int i = 0; i < index; i++) {
            pre=pre.next;
        }
        ListNode node = new ListNode(val);
        node.next=pre.next;
        pre.next=node;
    }


//    删除指定index节点
    public  void deleteAtIndex(int index){
        if (index>=size||index<0){
            return;
        }
        //待删除节点的前驱节点
        size--;
        if (index==0){
            head=head.next;
            return;
        }

        ListNode pre=head;
        for (int i = 0; i < index; i++) {
            pre=pre.next;
        }
//        ListNode delete=pre.next;
        pre.next=pre.next.next;

    }

}
